29/12/2024 - 04/01/2025

02/01/2025 04:52

I was playing around with making MIDAS clients. I found out you can't create multiple clients in on C++ program. It leads to race conditions within MIDAS. I wish I knew that before spending 4 hours creating a library to launch mutliple clients.

receiver_lib_test: /home/pioneer/packages/midas/src/system.cxx:2976: INT ss_mutex_create(MUTEX_T**, BOOL): Assertion `status == 0' failed.
receiver_lib_test: /home/pioneer/packages/midas/src/system.cxx:2976: INT ss_mutex_create(MUTEX_T**, BOOL): Assertion `status == 0' failed.

Here is the github of the branch of my "midas_receiver" that fails:

On the bright side, I still have my working branch that just launches one client. That branch is available here


29/12/2024 20:06

28f769c05de4d6aacfc33601185b228f.png

Just a note that at low rates, I was able to run the g-2 modified DAQ for 20 hours without erroring out. Providing evidence that CCC: Run aborts are indeed caused by higher rate applications somehow. by


29/12/2024 20:45

This is in $MIDASSYS/midasio/midasio.h for reference:

class TMEvent
{
public: // event data
   bool error;                  ///< event has an error - incomplete, truncated, inconsistent or corrupted
   
   uint16_t event_id;           ///< MIDAS event ID
   uint16_t trigger_mask;       ///< MIDAS trigger mask
   uint32_t serial_number;      ///< MIDAS event serial number
   uint32_t time_stamp;         ///< MIDAS event time stamp (unix time in sec)
   uint32_t data_size;          ///< MIDAS event data size

   size_t   event_header_size;  ///< size of MIDAS event header
   uint32_t bank_header_flags;  ///< flags from the MIDAS event bank header

   std::vector<TMBank> banks;   ///< list of MIDAS banks, fill using FindAllBanks()
   std::vector<char> data;      ///< MIDAS event bytes

public: // internal data

   bool found_all_banks;        ///< all the banks in the event data have been discovered
   size_t bank_scan_position;   ///< location where scan for MIDAS banks was last stopped

public: // constructors
   TMEvent(); // ctor
   TMEvent(const void* buf, size_t buf_size); // ctor
   void Reset();       ///< reset everything
   void ParseEvent();  ///< parse event data
   void ParseHeader(const void* buf, size_t buf_size); ///< parse event header
   void Init(uint16_t event_id, uint16_t trigger_mask = 0, uint32_t serial_number = 0, uint32_t time_stamp = 0, size_t capacity = 0);

public: // read data
   void FindAllBanks();                      ///< scan the MIDAS event, find all data banks
   TMBank* FindBank(const char* bank_name);  ///< scan the MIDAS event
   char* GetEventData();                     ///< get pointer to MIDAS event data
   const char* GetEventData() const;         ///< get pointer to MIDAS event data
   char* GetBankData(const TMBank*);         ///< get pointer to MIDAS data bank
   const char* GetBankData(const TMBank*) const; ///< get pointer to MIDAS data bank

public: // add data
   void AddBank(const char* bank_name, int tid, const char* buf, size_t size); ///< add new MIDAS bank

public: // bank manipulation
   //void DeleteBank(const TMBank*);           ///< delete MIDAS bank

public: // information methods

   std::string HeaderToString() const;            ///< print the MIDAS event header
   std::string BankListToString() const;          ///< print the list of MIDAS banks
   std::string BankToString(const TMBank*) const; ///< print definition of one MIDAS bank

   void PrintHeader() const;
   void PrintBanks(int level = 0);
   void DumpHeader() const;
};
class TMEvent
{
public: // event data
   bool error;                  ///< event has an error - incomplete, truncated, inconsistent or corrupted
   
   uint16_t event_id;           ///< MIDAS event ID
   uint16_t trigger_mask;       ///< MIDAS trigger mask
   uint32_t serial_number;      ///< MIDAS event serial number
   uint32_t time_stamp;         ///< MIDAS event time stamp (unix time in sec)
   uint32_t data_size;          ///< MIDAS event data size

   size_t   event_header_size;  ///< size of MIDAS event header
   uint32_t bank_header_flags;  ///< flags from the MIDAS event bank header

   std::vector<TMBank> banks;   ///< list of MIDAS banks, fill using FindAllBanks()
   std::vector<char> data;      ///< MIDAS event bytes

public: // internal data

   bool found_all_banks;        ///< all the banks in the event data have been discovered
   size_t bank_scan_position;   ///< location where scan for MIDAS banks was last stopped

public: // constructors
   TMEvent(); // ctor
   TMEvent(const void* buf, size_t buf_size); // ctor
   void Reset();       ///< reset everything
   void ParseEvent();  ///< parse event data
   void ParseHeader(const void* buf, size_t buf_size); ///< parse event header
   void Init(uint16_t event_id, uint16_t trigger_mask = 0, uint32_t serial_number = 0, uint32_t time_stamp = 0, size_t capacity = 0);

public: // read data
   void FindAllBanks();                      ///< scan the MIDAS event, find all data banks
   TMBank* FindBank(const char* bank_name);  ///< scan the MIDAS event
   char* GetEventData();                     ///< get pointer to MIDAS event data
   const char* GetEventData() const;         ///< get pointer to MIDAS event data
   char* GetBankData(const TMBank*);         ///< get pointer to MIDAS data bank
   const char* GetBankData(const TMBank*) const; ///< get pointer to MIDAS data bank

public: // add data
   void AddBank(const char* bank_name, int tid, const char* buf, size_t size); ///< add new MIDAS bank

public: // bank manipulation
   //void DeleteBank(const TMBank*);           ///< delete MIDAS bank

public: // information methods

   std::string HeaderToString() const;            ///< print the MIDAS event header
   std::string BankListToString() const;          ///< print the list of MIDAS banks
   std::string BankToString(const TMBank*) const; ///< print definition of one MIDAS bank

   void PrintHeader() const;
   void PrintBanks(int level = 0);
   void DumpHeader() const;
};

This is just a class for handling event data, useful reference.